/*
 * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

package com.sun.corba.se.impl.monitoring;

import java.util.Map;
import java.util.HashMap;
import java.util.Collection;
import java.util.Iterator;

import com.sun.corba.se.spi.monitoring.MonitoredObject;
import com.sun.corba.se.spi.monitoring.MonitoredAttribute;

public class MonitoredObjectImpl implements MonitoredObject {
    private final String name;
    private final String description;

    // List of all child Monitored Objects
    private Map children = new HashMap();

    // All the Attributes of this Monitored Object instance
    private Map monitoredAttributes = new HashMap();

    private MonitoredObject parent = null;

    // Constructor
    MonitoredObjectImpl(String name, String description) {
        this.name = name;
        this.description = description;
    }

    public MonitoredObject getChild(String name) {
        synchronized (this) {
            return (MonitoredObject) children.get(name);
        }
    }

    public Collection getChildren() {
        synchronized (this) {
            return children.values();
        }
    }

    public void addChild(MonitoredObject m) {
        if (m != null) {
            synchronized (this) {
                children.put(m.getName(), m);
                m.setParent(this);
            }
        }
    }

    public void removeChild(String name) {
        if (name != null) {
            synchronized (this) {
                children.remove(name);
            }
        }
    }

    public synchronized MonitoredObject getParent() {
        return parent;
    }

    public synchronized void setParent(MonitoredObject p) {
        parent = p;
    }

    public MonitoredAttribute getAttribute(String name) {
        synchronized (this) {
            return (MonitoredAttribute) monitoredAttributes.get(name);
        }
    }

    public Collection getAttributes() {
        synchronized (this) {
            return monitoredAttributes.values();
        }
    }

    public void addAttribute(MonitoredAttribute value) {
        if (value != null) {
            synchronized (this) {
                monitoredAttributes.put(value.getName(), value);
            }
        }
    }

    public void removeAttribute(String name) {
        if (name != null) {
            synchronized (this) {
                monitoredAttributes.remove(name);
            }
        }
    }

    /**
     * calls clearState() on all the registered children MonitoredObjects and
     * MonitoredAttributes.
     */
    public void clearState() {
        synchronized (this) {
            Iterator i = monitoredAttributes.values().iterator();
            // First call clearState on all the local attributes
            while (i.hasNext()) {
                ((MonitoredAttribute) i.next()).clearState();
            }
            i = children.values().iterator();
            // next call clearState on all the children MonitoredObjects
            while (i.hasNext()) {
                ((MonitoredObject) i.next()).clearState();
            }
        }
    }

    public String getName() {
        return name;
    }

    public String getDescription() {
        return description;
    }
}
